2012-09-20 71 views
2

我知道有很多關於它的問題,但我找不到一個好的回答我的問題。JPA OneToMany雙向

我使用JBoss AS 7,Spring和Hibernate(4)JPA 2.0提供商所以我有簡單@OneToMany雙向關係:

我有超類人那樣:

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Person { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 

@NotNull 
@Size(min = 1, max = 25) 
@Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters and spaces") 
private String name; 


public Person(String name) { 
    super(); 
    this.name = name; 
} 

和類會員:

@Entity 
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email")) 
public class Member extends Person implements Serializable 
{ 
    /** Default value included to remove warning. Remove or modify at will. **/ 
    private static final long serialVersionUID = 1L; 


    @NotNull 
    @NotEmpty 
    @Email 
    private String email; 

    @NotNull 
    @Size(min = 10, max = 12) 
    @Digits(fraction = 0, integer = 12) 
    @Column(name = "phone_number") 
    private String phoneNumber; 

    @OneToMany(cascade=CascadeType.ALL , mappedBy="member" , fetch=FetchType.EAGER) 
    private List<Order> orders; 

而且還Order類:

@Entity 
public class Order { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Integer id; 

private float price; 

@ManyToOne(optional=false) 
private Member member; 

private String name; 

所以我認爲這是一個很好的配置,但我測試的HSQL在內存中這個應用程序,我有錯誤:

Hibernate: alter table Order drop constraint FK48E972E548C740B 
2012-09-20 16:25:37 org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: alter table Order drop constraint FK48E972E548C740B 
2012-09-20 16:25:37 org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: Blad skladniowy w wyrazeniu SQL "ALTER TABLE ORDER[*] DROP CONSTRAINT FK48E972E548C740B "; oczekiwano "identifier" 
Syntax error in SQL statement "ALTER TABLE ORDER[*] DROP CONSTRAINT FK48E972E548C740B "; expected "identifier"; SQL statement: 
alter table Order drop constraint FK48E972E548C740B [42001-165] 

而且也:

Syntax error in SQL statement "CREATE TABLE ORDER[*] (ID INTEGER GENERATED BY DEFAULT AS IDENTITY, NAME VARCHAR(255), PRICE FLOAT NOT NULL, MEMBER_ID BIGINT NOT NULL, PRIMARY KEY (ID)) "; expected "identifier"; SQL statement: 

我的JUnit測試失敗我不知道什麼是錯的這個配置...

這是我簡單的JUnit:

@Test 
public void testInsertWithOrder(){ 
    Order order = new Order(20.0f, "first stuff"); 
    Order order2 = new Order(40.0f, "secondary stuff"); 
    List<Order> orders = new ArrayList<Order>(); 
    orders.add(order2); 
    orders.add(order); 

    Member member = new Member("Member name", "[email protected]", "2125552141", orders); 

    memberDao.register(member); 

    List<Member> members = memberDao.findAllOrderedByName(); 

    Assert.assertNotNull(members); 
    Assert.assertEquals(1, members.size());  

} 

回答

10

變化表名從「秩序」,以不同的東西,像PersonOrder

+1

是,'user1516873'是對的,如果你使用'MySqL','Order'字是MySQL的保留字。 – CycDemo

+0

+1你說得對。但我仍然有錯誤:NULL不允許列「MEMBER_ID」; SQL語句: insert into UOrder(id,member_id,name,price)values(null,?,?,?)[23502-165]' –

+1

感謝user1516873,同樣的關鍵字在PostgreSQL上保留, – dsuess

1

在你memberOrder類中,有缺失@JoinColumn註解。嘗試如下。

@ManyToOne(optional=false) 
@JoinColumn(name = "memberId", referencedColumnName = "id") 
private Member member; 
+0

我嘗試了,但我也有錯誤,我的junit失敗: –

+2

在H2保留的Keywork中,'Order'就是其中之一;請參閱http://www.scribd.com/doc/88837291/224/Keywords-Reserved-Words'CROSS,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,DISTINCT,EXCEPT,EXISTS,FALSE,FOR,FROM,FULL,GROUP,HAVING,INNER ,INTERSECT,IS,JOIN,LIKE,LIMIT,MINUS,NATURAL,NOT,NULL,ON,ORDER,PRIMARY,ROWNUM,SELECT,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY,TRUE,UNION,UNIQUE,Where' – CycDemo

+0

是的,我是如此愚蠢的:)它是如此容易...我改變我的班級名稱爲UOrder –

1

@CycDemo

我只是弄清楚,在我constuctor我現在已經得到了:

@OneToMany(cascade=CascadeType.ALL , mappedBy="member" , fetch=FetchType.EAGER) 
    private List<UOrder> orders = new ArrayList<UOrder>(); 



     public Member(String name, String email, String phoneNumber ,List<UOrder> orders) { 
     super(name); 
     this.orders = orders; 
     this.email = email; 
     for(UOrder o : orders){ 
      o.setMember(this);   
     } 
     this.orders = orders; 

    } 

螞蟻這是我所需要的:)))