问题
I\'m trying to get Hibernate @OneToOne annotations working and not having much success here...
Let\'s say I\'ve got a table called status
that looks like this:
+------------------------------------------------+
| status |
+------------------------------------------------+
| id | frn_user_id | frn_content_id | status |
+----+-------------+----------------+------------+
| 1 | 111 | 0 | \"active\" |
+----+-------------+----------------+------------+
| 2 | 0 | 222 | \"inactive\" |
+----+-------------+----------------+------------+
And I\'ve got an entity for User
that looks like this:
@Entity
@Table(name = \"user\")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = \"id\", nullable = false)
private Integer id;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = \"userId\")
private Status status;
// getters and setters
}
And a similar one for Content
, and another entity for Status
that looks like this:
@Entity
@Table(name = \"status\")
public class Status {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = \"id\", nullable = false)
private Integer id;
@Column(name = \"frn_user_id\")
private Integer userId;
@Column(name = \"frn_content_id\")
private Integer contentId;
@Column(name = \"status\")
private String status;
// getters and setters
}
When I perform a read on User
, I expect that User.getStatus()
will return a Status
object with id=1
. Instead, I get an AnnotationException: \"Referenced property not a (One|Many)ToOne: Status.userId in mappedBy User.status\"
I\'ve poured through docs, tutorials and examples here on SO, but everything I\'ve tried so far has failed.
Also worth noting: This should support a one-to-zero-or-one relationship, as some user
and content
records will not have a reference in the status
table.
Any help would be greatly appreciated!
回答1:
Your Status entity must not have properties userId
and contentId
of type Integer, mapped with @Column
. It must have properties user
and content
of type User and Content, mapped with @OneToOne
:
public class User {
@OneToOne(mappedBy = "user")
private Status status;
// ...
}
public class Status {
@OneToOne
@JoinColumn(name = "frn_user_id")
private User user;
// ...
}
A user has one status. A status has one user.
回答2:
use this way. Add below field in Customer entity.
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")
private Status status;
and don't add getter and setter for status field in Customer entity. And add below code to Status Entity.
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
Here add the getter and setter for customer field in Status Entity class. You can see one working example here.
来源:https://stackoverflow.com/questions/21762328/java-hibernate-onetoone-mapping