2012-01-17 24 views
0

我的使用情況如下:我使用MySQL和JPA 2,我有兩個實體:訂購的LineItem由一個一對多的關係相關問題與MySQL自動生成的PK用於另一個表和JPA

我想爲GUI層在同一時間一起LineItem的持續訂單。

銘記秩序PK是自動生成的由MySQL是LineItem的的PK的一部分,我不知道如何才能將其用於檢索生成的訂單PK LineItem PK在同一個事務中。

任何人都可以幫忙嗎?

而且您的反饋,這裏是從實體的一些示例代碼(我實際上是由用例/域之上。我的是更復雜的,所以你不會看到任何訂單或LineItem的)。

@Entity 
@Table(name = "advertisement") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "status_need_ID", discriminatorType = DiscriminatorType.INTEGER) 
@NamedQueries({ 
    @NamedQuery(name = "Advertisement.findAll", query = "SELECT a FROM Advertisement a"), 
    @NamedQuery(name = "Advertisement.findByAdvertisementID", query = "SELECT a FROM Advertisement a WHERE a.advertisementID = :advertisementID"), 
    @NamedQuery(name = "Advertisement.findByAdvertisementTitle", query = "SELECT a FROM Advertisement a WHERE a.advertisementTitle = :advertisementTitle"), 
    @NamedQuery(name = "Advertisement.findByAdvertisementCreationDate", query = "SELECT a FROM Advertisement a WHERE a.advertisementCreationDate = :advertisementCreationDate"), 
    @NamedQuery(name = "Advertisement.findByStatusneedID", query = "SELECT a FROM Advertisement a WHERE a.statusneedID = :statusneedID")}) 
public class Advertisement implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "advertisement_ID", nullable = false) 
    private Integer advertisementID; 
    @Basic(optional = false) 
    @Column(name = "advertisement_title", nullable = false, length = 200) 
    private String advertisementTitle; 
    @Column(name = "advertisement_creation_date") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date advertisementCreationDate; 
    @Basic(optional = false) 
    @Lob 
    @Column(name = "advertisement_body", nullable = false, length = 2147483647) 
    private String advertisementBody; 
    @Column(name = "status_need_ID") 
    private Integer statusneedID; 
    @JoinTable(name = "postcode_to_advertisement_join", joinColumns = { 
     @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "postcode_ID", referencedColumnName = "postcode_ID", nullable = false)}) 
    @ManyToMany 
    private Collection<Postcode> postcodeCollection; 
    @JoinTable(name = "advertisement_to_duration_join", joinColumns = { 
     @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "duration_ID", referencedColumnName = "duration_ID", nullable = false)}) 
    @ManyToMany 
    private Collection<Duration> durationCollection; 
    @JoinTable(name = "full_or_part_time_basis_to_advertisement_join", joinColumns = { 
     @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "full_or_part_time_basis_ID", referencedColumnName = "full_or_part_time_basis_ID", nullable = false)}) 
    @ManyToMany 
    private Collection<FullOrPartTimeBasis> fullOrPartTimeBasisCollection; 
    @JoinTable(name = "advertisement_to_child_care_type_join", joinColumns = { 
     @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "child_care_type_ID", referencedColumnName = "child_care_type_ID", nullable = false)}) 
    @ManyToMany 
    private Collection<ChildCareType> childCareTypeCollection; 
    @JoinTable(name = "advertisement_to_school_holiday_join", joinColumns = { 
     @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "school_holiday_ID", referencedColumnName = "school_holiday_ID", nullable = false)}) 
    @ManyToMany 
    private Collection<SchoolHoliday> schoolHolidayCollection; 
    @JoinTable(name = "employment_contract_to_advertisement_join", joinColumns = { 
     @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "employment_contract_ID", referencedColumnName = "employment_contract_ID", nullable = false)}) 
    @ManyToMany 
    private Collection<EmploymentContract> employmentContractCollection; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "advertisement") 
    private Collection<AdvertisementToTimeSlotToDayJoin> advertisementToTimeSlotToDayJoinCollection; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "advertisementID") 
    private Collection<Salary> salaryCollection; 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "advertisement") 
    private ParentToParentAdvertisement parentToParentAdvertisement; 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "advertisement") 
    private ParentToChildMinderAdvertisement parentToChildMinderAdvertisement; 
    @JoinColumn(name = "child_care_location_ID", referencedColumnName = "child_care_location_ID", nullable = false) 
    @ManyToOne(optional = false) 
    private ChildCareLocation childcarelocationID; 
    @JoinColumn(name = "account_ID", referencedColumnName = "account_ID", nullable = false) 
    @ManyToOne(optional = false) 
    private Account accountID; 



@Entity 
@Table(name = "advertisement_to_time_slot_to_day_join",schema="bignibou") 
@NamedQueries({ 
    @NamedQuery(name = "AdvertisementToTimeSlotToDayJoin.findAll", query = "SELECT a FROM AdvertisementToTimeSlotToDayJoin a"), 
    @NamedQuery(name = "AdvertisementToTimeSlotToDayJoin.findByDayID", query = "SELECT a FROM AdvertisementToTimeSlotToDayJoin a WHERE a.advertisementToTimeSlotToDayJoinPK.dayID = :dayID"), 
    @NamedQuery(name = "AdvertisementToTimeSlotToDayJoin.findByTimeslotID", query = "SELECT a FROM AdvertisementToTimeSlotToDayJoin a WHERE a.advertisementToTimeSlotToDayJoinPK.timeslotID = :timeslotID"), 
    @NamedQuery(name = "AdvertisementToTimeSlotToDayJoin.findByAdvertisementID", query = "SELECT a FROM AdvertisementToTimeSlotToDayJoin a WHERE a.advertisementToTimeSlotToDayJoinPK.advertisementID = :advertisementID")}) 
public class AdvertisementToTimeSlotToDayJoin implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected AdvertisementToTimeSlotToDayJoinPK advertisementToTimeSlotToDayJoinPK; 
    @JoinColumn(name = "time_slot_ID", referencedColumnName = "time_slot_ID", nullable = false, insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private TimeSlot timeSlot; 
    @JoinColumn(name = "day_ID", referencedColumnName = "day_ID", nullable = false, insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Day day; 
    @JoinColumn(name = "advertisement_ID", referencedColumnName = "advertisement_ID", nullable = false, insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Advertisement advertisement; 
+0

您可以加入的代碼實體映射? – 2012-01-17 15:41:26

+0

謝謝。如何做你在JPA中描述的內容?可能嗎? – balteo 2012-01-17 15:42:12

回答

2

這裏的基本想法,你將不得不在兩個階段保存你的實體。當然,你可以在同一個交易中完成。首先保存您的訂單,而不保存LineItem,然後檢索PK(如果訂單),然後將其設置爲LineItem(s),然後保存LineItem(s)。我想這是OneToMany註釋的CascadeType屬性,它會告訴JPA在兩個不同階段執行此操作,即在保存訂單時不保存LineItems。事情是這樣的:

@Entity 
public class Order { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    long id; 

    @OneToMany(cascade={}) 
    Set<LineItem> lineItems; 
} 

或保存訂單時,您已在設置了LineItem空,然後檢索PK,設置了LineItem,和了LineItem的PK,然後再保存訂單。

無視這部分的答案,如果你的數據庫設計是終局的,你不能改變它。

這是我個人的意見(基於多年的數據庫設計和維護)。因此,擺在首位,你有一個很好的理由中的LineItem採用複合PK而不是使用好,老surrogate primary key

因爲如果你不這樣做,那麼你應該在LineItem的代理主鍵。否則,你會一直運行到的各種問題(例如,如果你碰巧有遷移數據)

編輯我的建議:

  1. 在DB:使用AUTO_INCREMENT PK中你的表,因爲在這個例子中:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
  2. 在JPA映射:在這篇文章中去的第一個選項(自動):http://www.objectdb.com/java/jpa/entity/generated
+0

1.我很確定有一種方法可以用JPA配置對此問題進行排序。也許我應該使用帶分隔表的@TableGenerator?這會是一個很好的替代關鍵嗎?或者你建議我去UUID? – balteo 2012-01-17 16:19:24

+0

我沒有看到任何理由在這裏使用@TableGenerator。在這種情況下,我不明白UUID的含義。我的建議被添加到答案的最後。 – bpgergo 2012-01-17 17:32:03

+0

[UUID](http://docs.oracle.com/javase/6/docs/api/java/util/UUID。html) – balteo 2012-01-17 18:46:44