Spring i relacje miedzy klasami

0

Witam
Robię "prosty" projekt strony www z przepisami kulinarnymi. Mam 3 klasy (jak na razie) Category, Receipt, User. Chcę aby klasa Category tylko przechowywała poszczególne kategorie i była niedostępna dla Usera. Dostęp do kategorii miałby jedynie Admin (dodawanie, modyfikacja itp.). Przy tworzeniu przepisu USER ma możliwość wybrania co najmniej jednej kategorii.

Jak zrobić, aby do dane posiłku dodać parę kategorii?
Próbowałem zrobić to poprze @OneToMany, ale tworzy mi jedynie tabele pomocnicza "receipt_categories" a w tabeli RECEIPT nie ma zadnego odwołania do tej tabeli...

package com.example.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Entity
public class Category {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(unique = true)
	@Pattern(regexp = "([a-z]+ ?)+", message = "Tylko litery! (dozwolona jedna spacja miedzy wyrazami)")
	@Size(min = 4, max = 15, message = "Nazwa musi miescic sie od 4 do 15 znakow")
	private String categoryName;
	@Lob
	private byte[] categoryImage;
	public Category() {
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getCategoryName() {
		return categoryName;
	}

	public void setCategoryName(String categoryName) {
		categoryName = categoryName.trim();
		this.categoryName = categoryName;
	}
	
	public byte[] getCategoryImage() {
		return categoryImage;
	}

	public void setCategoryImage(byte[] categoryImage) {
		this.categoryImage = categoryImage;
	}

	@Override
	public String toString() {
		return categoryName;
	}

} 
 package com.example.model;

import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Entity
public class Receipt {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Pattern(regexp = "([a-zA-z]+ ?)+$", message = "Tylko litery! (dozwolona jedna spacja miedzy wyrazami)")
	@Size(min = 4, max = 25, message = "Minumum 4 znaki max 25")
	private String name;
	@Size(min = 10, max = 250, message = "Minumum 10 znaki max 250")
	private String ingridients;
	@Size(min = 10, max = 250, message = "Minumum 10 znakow max 250")
	private String description;
	@Lob
	private byte[] image;
	private int qtyPpl;
	private Date sumbitDate;

	@OneToOne	
	private User user;
	
	@OneToMany(cascade = CascadeType.ALL)
	private Set<Category> categories;

	public Receipt() {
		this.sumbitDate = new Date();
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		name = name.trim();
		this.name = name;
	}

	public String getIngridients() {
		return ingridients;
	}

	public void setIngridients(String ingridients) {
		this.ingridients = ingridients;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public byte[] getImage() {
		return image;
	}

	public void setImage(byte[] image) {
		this.image = image;
	}

	public int getQtyPpl() {
		return qtyPpl;
	}

	public void setQtyPpl(int qtyPpl) {
		this.qtyPpl = qtyPpl;
	}

	public Date getSumbitDate() {
		return sumbitDate;
	}

	public void setSumbitDate(Date sumbitDate) {
		this.sumbitDate = sumbitDate;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String toString() {
		return "Receipt [id=" + id + ", name=" + name + ", ingridients=" + ingridients + ", description=" + description
				+ ", qtyPpl=" + qtyPpl + ", sumbitDate=" + sumbitDate + ", user=" + user + "]";
	}

}

Z góry dzieki

0

Nie wiem czy nie brakuje mappedBy. Sprobuj tak zrobic:


 @OneToMany(cascade = CascadeType.ALL, mappedBy = "receipt "))
    private Set<Category> categories;
0
podroznik napisał(a):

Nie wiem czy nie brakuje mappedBy. Sprobuj tak zrobic:


 @OneToMany(cascade = CascadeType.ALL, mappedBy = "receipt "))
    private Set<Category> categories;

jak dodam mappedBy to wywala mi błąd. Wrzucam na http://wklej.org/id/2999554/ bo nie chce zasmiecac

0

A sorry nie zauwazylem ze masz jednokierunkowa relacje. W takm wypadku wywal to mappedBy, dodaj:

@JoinColumn(name="twoja_nazwa_kolumny")
0
podroznik napisał(a):

A sorry nie zauwazylem ze masz jednokierunkowa relacje. W takm wypadku wywal to mappedBy, dodaj:

@JoinColumn(name="twoja_nazwa_kolumny")

nie jest to co chciałem osiągnąć bo mi dodaje tabeli CATEGORY nowy klucz obcy. Ja chciałbym zostawić kategorie taka jaka jest bez kluczy obcych itp. Jedyne co i kto ma dostęp do tej tabeli to admin :dodawanie/usuwanie kategorii.
Może jakaś pomocnicza klasa załatwi sprawę? A dokładnie w klasie RECEIPT zamiast

private List<Category> categories;

zmienić na

 private List<RTC> rtc;

I zrobić nowa klasę RTC

 public class RTC {
	private Long id;
	private Category category;
	private Receipt receipt;
}

Tylko co dalej :) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1