2017-06-21 66 views
0

我有一个房间实体,一个规则实体和一个设施实体。我想要做的是规则和设施实体手动预先填充,当我插入一个房间时,我需要根据用户选择将两个连接表映射到两个连接表,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。

有没有更好的方法来做这一切?现在我第一次坚持新的房间, 和级联坚持图片和位置,然后我合并房间与主机,设施和规则的新价值更新。

+0

请发布您的实体类。 –

+0

@AbdullahKhan完成了! – peterthunder

回答

0

UPDATE 我修复了这个问题。现在我做了一个插入实体,我想坚持与房间,又名位置和图片,并合并连接表中的连接表和主机/类型外键detatched实体amenities /规则。主机和类型的问题是,我在@JoinColumn中可更新和可以证明是错误的。我删除了这些陈述后,它的工作!我的代码最后坚持/合并detatched和新实体是这样的:

public Room addRoom(RoomInput room) { 
     dao.setParam("username", room.getOwner()); 
     HostEntity host = null; 
     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()); 
     System.out.println(owner.get(0).toString()); 
     newRoom.setLocationEntity(room.getLocation().toEntity()); 
     for(Picture o :room.getPictures()){ 
      newRoom.getPictureEntities().add(o.toEntity()); 
     } 
     RoomEntity entity = dao.insertTuple(newRoom); 

     for(Amenities o : room.getAmenities()){ 
      entity.getAmenitiesEntities().add(o.toEntity()); 
     } 
     for(Rule o : room.getRules()){ 
      entity.getRuleEntities().add(o.toEntity()); 
     } 
     entity.setHostEntity(owner.get(0)); 
     entity.setTypeEntity(room.getType().toEntity()); 
     dao.updateTuple(entity); 
     System.out.println(entity.toString()); 
     return (entity == null) ? null : entity.toModel(0); 
    }