我有一個房間實體,一個規則實體和一個設施實體。我想要做的是規則和設施實體手動預先填充,當我插入一個房間時,我需要根據用戶選擇將兩個連接表映射到兩個連接表,room_rules和room_amenities中的哪些規則和設施。Jpa一對多使用連接表
我該怎麼做到這一點?當我堅持一個新的房間實體時,它是否應該包含規則和設施?如果它們的集合沒有被映射爲cascade.persist,它會起作用嗎?
或者我應該堅持沒有他們的房間,然後將他們映射到房間?
我該怎麼辦?
UPDATE
我RoomEntity:
public class RoomEntity {
@Id
@GeneratedValue(strategy= GenerationType.SEQUENCE)
@Column(name = "id", nullable =false, unique = true)
private Integer id;
@Basic
@Column(name = "title", nullable = false, length = 45)
private String title;
@Basic
@Column(name = "description", nullable = false, length = 300)
private String description;
@Basic
@Column(name = "square_meters", nullable = false)
private Integer square_meters;
@Basic
@Column(name = "overnight_price", nullable = false)
private double overnight_price;
@Basic
@Column(name = "exta_person_price", nullable = false)
private double exta_person_price;
@Basic
@Column(name = "max_people", nullable = false)
private Integer max_people;
@Basic
@Column(name = "min_overnights", nullable = false)
private Integer min_overnights;
@Basic
@Column(name = "beds", nullable = false)
private Integer beds;
@Basic
@Column(name = "bathrooms", nullable = false)
private Integer bathrooms;
@Basic
@Column(name = "bedrooms", nullable = false)
private Integer bedrooms;
@Basic
@Column(name = "transport", length = 300)
private String transport;
@Basic
@Column(name = "neightborhood", length = 300)
private String neightborhood;
@Basic
@Column(name = "house_rules", length = 200)
private String house_rules;
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "room_host", referencedColumnName = "username", /*nullable = false,*/ insertable = false, updatable = false)
private HostEntity hostEntity;
public HostEntity getHostEntity() {
return hostEntity;
}
public void setHostEntity(HostEntity hostEntity) {
this.hostEntity = hostEntity;
}
@OneToOne
@JoinColumn(name = "room_type_id", referencedColumnName = "id", /*nullable = false,*/ insertable = false, updatable = false)
private TypeEntity typeEntity;
public TypeEntity getTypeEntity() {
return typeEntity;
}
public void setTypeEntity(TypeEntity typeEntity) {
this.typeEntity = typeEntity;
}
@OneToOne(cascade={CascadeType.ALL})
@JoinColumn(name = "room_location", referencedColumnName = "id"/*, nullable = false, insertable = false, updatable = false*/)
private LocationEntity locationEntity;
public LocationEntity getLocationEntity() {
return locationEntity;
}
public void setLocationEntity(LocationEntity locationEntity) {
this.locationEntity = locationEntity;
}
@OneToMany(cascade = {CascadeType.ALL})
@JoinTable(
/*name = "room_pictures",*/
joinColumns = {@JoinColumn(name = "room_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn (name ="picture_id", referencedColumnName = "id", unique = true)}
)
private Collection<PictureEntity> pictureEntities = new ArrayList<>();
public Collection<PictureEntity> getPictureEntities() {
return pictureEntities;
}
public void setPictureEntities(Collection<PictureEntity> pictureEntities) {
this.pictureEntities = pictureEntities;
}
@OneToMany
@JoinTable(
/*name = "room_amenities",*/
joinColumns = {@JoinColumn(name = "room_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn (name ="amenity_id", referencedColumnName = "id")}
)
private Collection<AmenitiesEntity> amenitiesEntities = new ArrayList<>();
public Collection<AmenitiesEntity> getAmenitiesEntities() {
return amenitiesEntities;
}
public void setAmenitiesEntities(Collection<AmenitiesEntity> amenitiesEntities) {
this.amenitiesEntities = amenitiesEntities;
}
@OneToMany
@JoinTable(
/*name = "room_amenities",*/
joinColumns = {@JoinColumn(name = "room_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn (name ="rule_id", referencedColumnName = "id")}
)
private Collection<RuleEntity> ruleEntities = new ArrayList<>();
public Collection<RuleEntity> getRuleEntities() {
return ruleEntities;
}
public void setRuleEntities(Collection<RuleEntity> ruleEntities) {
this.ruleEntities = ruleEntities;
}
public Collection<Picture> toPicturesModel(){
Collection<Picture> pictures = new ArrayList<>();
for(PictureEntity o : this.pictureEntities){
pictures.add(o.toModel());
}
return pictures;
}
public Collection<Amenities> toAmenitiesModel(){
Collection<Amenities> amenities = new ArrayList<>();
for(AmenitiesEntity o : this.amenitiesEntities){
amenities.add(o.toModel());
}
return amenities;
}
public Collection<Rule> toRulesModel(){
Collection<Rule> rules = new ArrayList<>();
for(RuleEntity o : this.ruleEntities){
rules.add(o.toModel());
}
return rules;
}
public Room toModel(Integer depth){
System.out.println("RoomEntity:::toModel()");
return new Room(
this.hostEntity == null? null : this.hostEntity.toModel(depth),
this.getTypeEntity() == null? null : this.typeEntity.toModel(),
this.getLocationEntity()== null? null : this.locationEntity.toModel(),
this.getPictureEntities() == null ? null : this.toPicturesModel(),
this.getAmenitiesEntities() == null? null : this.toAmenitiesModel(),
this.getRuleEntities() == null? null : this.toRulesModel(),
this.title, this.description, this.square_meters,
this.overnight_price, this.exta_person_price,
this.max_people, this.min_overnights, this.beds, this.bathrooms,
this.bedrooms, this.transport, this.neightborhood, this.house_rules);
}
}
我HostEntity從RenterEntity繼承主鍵的用戶名:
public class HostEntity extends RenterEntity {
@Basic
@Column(name = "about", length = 200)
private String about;
@Basic
@Column(name = "confirmed", nullable = false)
private boolean confirmed;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hostEntity")
private Collection<RoomEntity> roomEntities;
public Collection<RoomEntity> getRoomEntities() {
return roomEntities;
}
public void setRoomEntities(Collection<RoomEntity> roomEntities) {
this.roomEntities = roomEntities;
}
我LocationEntity:
public class LocationEntity{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@Column(name = "id", nullable =false, unique = true)
private Integer id;
@Basic
@Column(name = "latitude", nullable = false, precision = 0)
private double latitude;
@Basic
@Column(name = "longitude", nullable = false, precision = 0)
private double longitude;
@Basic
@Column(name = "street_number", length = STREET_MAX)
private String street_number;
@Basic
@Column(name= "route", length = ROUTE_MAX)
private String route;
@Basic
@Column(name = "locality", length = LOCALITY_MAX)
private String locality;
@Basic
@Column(name = "postal_code", length = POSTAL_CODE_MAX)
private String postal_code;
@Basic
@Column(name = "country", length = COUNTRY_MAX)
private String country;
@Basic
@Column(name = "administrative_area_level_5", length = ADMINISTRATIVE_AREA_LEVEL_MAX)
private String administrative_area_level_5;
@Basic
@Column(name = "administrative_area_level_4", length = ADMINISTRATIVE_AREA_LEVEL_MAX)
private String administrative_area_level_4;
@Basic
@Column(name = "administrative_area_level_3", length = ADMINISTRATIVE_AREA_LEVEL_MAX)
private String administrative_area_level_3;
@Basic
@Column(name = "administrative_area_level_2", length = ADMINISTRATIVE_AREA_LEVEL_MAX)
private String administrative_area_level_2;
@Basic
@Column(name = "administrative_area_level_1", length = ADMINISTRATIVE_AREA_LEVEL_MAX)
private String administrative_area_level_1;
@Basic
@Column(name = "formatted_address", length = FORMATTED_ADRESS_MAX, nullable = false, unique = true)
private String formatted_address;
}
我TypeEntity:
public class TypeEntity {
@Id
@Column(name = "id", nullable = false, unique = true)
private Integer id;
@Basic
@Column(name = "type_name", nullable = false, length = 45)
private String type;
@OneToOne(mappedBy = "typeEntity")
private RoomEntity roomEntity;
}
我RuleEntity:
public class RuleEntity {
@Id
@Column(name = "id", nullable =false, unique = true)
//@GeneratedValue(strategy= GenerationType.SEQUENCE)
private Integer id;
@Basic
@Column(name = "rule", nullable =false , unique = true, length = 50)
private String rule;
}
我PictureEntity:
public class PictureEntity {
@Id
@Column(name = "id", nullable =false, unique = true)
@GeneratedValue(strategy= GenerationType.SEQUENCE)
private Integer picture_id;
@Basic
@Column(name = "thumbnail_url", nullable =false, length = 100)
private String thumbnail_url;
@Basic
@Column(name = "medium_url", nullable =false, length = 100)
private String medium_url;
@Basic
@Column(name = "picture_url", nullable =false, length = 100)
private String picture_url;
@Basic
@Column(name = "xl_picture_url", nullable =false, length = 100)
private String xl_picture_url;
}
我AmenitiesEntity:
public class AmenitiesEntity {
@Id
@Column(name = "id", nullable =false, unique = true)
//@GeneratedValue(strategy= GenerationType.SEQUENCE)
private Integer id;
@Basic
@Column(name = "name", nullable = false, unique = true, length = 50)
private String amenity;
}
我的代碼創建一個房間是這樣的:
public Room addRoom(RoomInput room) {
dao.setParam("username", room.getOwner());
List<HostEntity> owner = dao.getTuples("users.findByUsername");
RoomEntity newRoom = new RoomEntity(room.getTitle(), room.getDescription(), room.getSquare_meters(), room.getOvernight_price(),
room.getExta_person_price(), room.getMax_people(), room.getMin_overnights(), room.getBeds(), room.getBathrooms(),
room.getBedrooms(), room.getTransport(), room.getNeightborhood(), room.getHouse_rules());
newRoom.setLocationEntity(room.getLocation().toEntity());
for(Picture o :room.getPictures()){
newRoom.getPictureEntities().add(o.toEntity());
}
RoomEntity entity = dao.insertTuple(newRoom);
entity.setHostEntity(owner.get(0));
for(Amenities o : room.getAmenities()){
entity.getAmenitiesEntities().add(o.toEntity());
}
for(Rule o : room.getRules()){
entity.getRuleEntities().add(o.toEntity());
}
entity.setTypeEntity(room.getType().toEntity());
entity = dao.updateTuple(entity);
System.out.println(entity.toString());
return (entity == null) ? null : entity.toModel(0);
}
現在發生的是,儘管我的3個連接表, room_pictures,room_rules,room_amenities得到正確更新, 我把數據庫中的房間有主外鍵(用戶名) 和類型(id)null。
有沒有更好的方法來做這一切?現在我第一次堅持新的房間, 和級聯堅持圖片和位置,然後我合併房間與主機,設施和規則的新價值更新。
請發佈您的實體類。 –
@AbdullahKhan完成了! – peterthunder