'Java: Hibernate @OneToOne mapping
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!
Solution 1:[1]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Abhishek |