JPA 与 EclipseLink ManyToMany 关系不起作用
JPA with EclipseLink ManyToMany relationship not working
我正在尝试为 Phone 目录设置一个应用程序,其中每个用户可以拥有多个 phone,并且每个 phone 可以分配给多个用户。我正在使用 JPA 和 EclipseLink 来完成这项工作。在检索其中一张表时,JPA 抛出异常。
详情如下——
异常跟踪 -
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 't0.users_ID' in 'where clause'
Error Code: 1054
Call: SELECT t1.ID, t1.FIRSTNAME, t1.LASTNAME, t1.TITLE, t1.CITY, t1.STATE, t1.STREET, t1.ZIP FROM Phone_User t0, User t1 WHERE ((t0.Phone_ID = ?) AND (t1.ID = t0.users_ID))
bind => [1 parameter bound]
Query: ReadAllQuery(name="users" referenceClass=User sql="SELECT t1.ID, t1.FIRSTNAME, t1.LASTNAME, t1.TITLE, t1.CITY, t1.STATE, t1.STREET, t1.ZIP FROM Phone_User t0, User t1 WHERE ((t0.Phone_ID = ?) AND (t1.ID = t0.users_ID))") (through reference chain: edu.lab2.beans.Phone["users"]);
User.java
@Entity
@Table(name = "User")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String firstname;
private String lastname;
private String title;
@Embedded
private Address address;
@ManyToMany
@JoinTable(name = "Phone_User", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "phone_id", referencedColumnName = "id"))
private List<Phone> phones;
Phone.java
@Entity
@Table(name = "Phone")
public class Phone {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String number; // Note, phone numbers must be unique
private String description;
@Embedded
private Address address;
private List<User> users;
@ManyToMany(mappedBy="phones")
public List<User> getUsers() {
return users;
}
Tables -
mysql> DESC User;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| firstname | varchar(40) | YES | | NULL | |
| lastname | varchar(40) | YES | | NULL | |
| title | varchar(10) | YES | | NULL | |
| street | varchar(40) | YES | | NULL | |
| city | varchar(40) | YES | | NULL | |
| state | varchar(40) | YES | | NULL | |
| zip | varchar(20) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
| state | varchar(40) | YES | | NULL | |
8 rows in set (0.03 sec)
mysql> DESC Phone;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| number | varchar(20) | YES | UNI | NULL | |
| description | varchar(20) | YES | | NULL | |
| street | varchar(40) | YES | | NULL | |
| city | varchar(40) | YES | | NULL | |
| state | varchar(40) | YES | | NULL | |
| zip | varchar(20) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
mysql> DESC Phone_User;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| user_id | int(11) | NO | PRI | NULL | |
| phone_id | int(11) | NO | PRI | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
我很困惑为什么 EclipseLink 或 JPA 在 Join Table?
中搜索 users_id
Phone
实体混合了字段和 属性 访问类型(请参阅 JPA 2.1 规范,第 2.3 章)。尝试将 @ManyToMany(mappedBy="phones")
注释放在 private List<User> users
字段上。
如果你真的需要在字段和属性之间拆分注解(阅读:getters),你可以用@Access(AccessType.PROPERTY)
注解特定的属性,即在这种情况下:
@Access(AccessType.PROPERTY)
@ManyToMany(mappedBy="phones")
public List<User> getUsers() {
return users;
}
我正在尝试为 Phone 目录设置一个应用程序,其中每个用户可以拥有多个 phone,并且每个 phone 可以分配给多个用户。我正在使用 JPA 和 EclipseLink 来完成这项工作。在检索其中一张表时,JPA 抛出异常。
详情如下——
异常跟踪 -
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 't0.users_ID' in 'where clause'
Error Code: 1054
Call: SELECT t1.ID, t1.FIRSTNAME, t1.LASTNAME, t1.TITLE, t1.CITY, t1.STATE, t1.STREET, t1.ZIP FROM Phone_User t0, User t1 WHERE ((t0.Phone_ID = ?) AND (t1.ID = t0.users_ID))
bind => [1 parameter bound]
Query: ReadAllQuery(name="users" referenceClass=User sql="SELECT t1.ID, t1.FIRSTNAME, t1.LASTNAME, t1.TITLE, t1.CITY, t1.STATE, t1.STREET, t1.ZIP FROM Phone_User t0, User t1 WHERE ((t0.Phone_ID = ?) AND (t1.ID = t0.users_ID))") (through reference chain: edu.lab2.beans.Phone["users"]);
User.java
@Entity
@Table(name = "User")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String firstname;
private String lastname;
private String title;
@Embedded
private Address address;
@ManyToMany
@JoinTable(name = "Phone_User", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "phone_id", referencedColumnName = "id"))
private List<Phone> phones;
Phone.java
@Entity
@Table(name = "Phone")
public class Phone {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String number; // Note, phone numbers must be unique
private String description;
@Embedded
private Address address;
private List<User> users;
@ManyToMany(mappedBy="phones")
public List<User> getUsers() {
return users;
}
Tables -
mysql> DESC User;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| firstname | varchar(40) | YES | | NULL | |
| lastname | varchar(40) | YES | | NULL | |
| title | varchar(10) | YES | | NULL | |
| street | varchar(40) | YES | | NULL | |
| city | varchar(40) | YES | | NULL | |
| state | varchar(40) | YES | | NULL | |
| zip | varchar(20) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
| state | varchar(40) | YES | | NULL | |
8 rows in set (0.03 sec)
mysql> DESC Phone;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| number | varchar(20) | YES | UNI | NULL | |
| description | varchar(20) | YES | | NULL | |
| street | varchar(40) | YES | | NULL | |
| city | varchar(40) | YES | | NULL | |
| state | varchar(40) | YES | | NULL | |
| zip | varchar(20) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
mysql> DESC Phone_User;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| user_id | int(11) | NO | PRI | NULL | |
| phone_id | int(11) | NO | PRI | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
我很困惑为什么 EclipseLink 或 JPA 在 Join Table?
中搜索users_id
Phone
实体混合了字段和 属性 访问类型(请参阅 JPA 2.1 规范,第 2.3 章)。尝试将 @ManyToMany(mappedBy="phones")
注释放在 private List<User> users
字段上。
如果你真的需要在字段和属性之间拆分注解(阅读:getters),你可以用@Access(AccessType.PROPERTY)
注解特定的属性,即在这种情况下:
@Access(AccessType.PROPERTY)
@ManyToMany(mappedBy="phones")
public List<User> getUsers() {
return users;
}