org.hibernate.MappingException: Foreign key XXX must have same number of columns as the referenced primary...
Having a following SQL table:
create table users_posts_ratings_map (
postId integer not null references posts (id),
userId integer not null references users (id),
ratingId integer not null references ratings (id),
primary key (postId, userId)
);
and Following JPA-Annotated POJOs:
RatingId.java:
@Embeddable
public class RatingId implements Serializable {
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@ManyToOne
@JoinColumn(name = "postId")
private Post post;
// getters and setters
}
UserPostRating.java:
@Entity(name = "users_posts_ratings_map")
public class UserPostRating {
@EmbeddedId
private RatingId userPost;
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
// getters and setters
}
Post.java
@Entity(name = "posts")
public class Post {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// irrelevant fields
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
// getters and setters
}
I am getting
org.hibernate.MappingException: Foreign key (FKB278E73083D94769:users_posts_ratings_map [postId,userId])) must have same number of columns as the referenced primary key (users_posts_ratings_map [ratingId,postId,userId])
on servlet container initialization stage.
What does it mean (What are Foreign Keys in this mappings? What are Primary Keys? Which annotations are marking what?) and how it could be fixed?
java hibernate jpa orm hibernate-mapping
add a comment |
Having a following SQL table:
create table users_posts_ratings_map (
postId integer not null references posts (id),
userId integer not null references users (id),
ratingId integer not null references ratings (id),
primary key (postId, userId)
);
and Following JPA-Annotated POJOs:
RatingId.java:
@Embeddable
public class RatingId implements Serializable {
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@ManyToOne
@JoinColumn(name = "postId")
private Post post;
// getters and setters
}
UserPostRating.java:
@Entity(name = "users_posts_ratings_map")
public class UserPostRating {
@EmbeddedId
private RatingId userPost;
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
// getters and setters
}
Post.java
@Entity(name = "posts")
public class Post {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// irrelevant fields
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
// getters and setters
}
I am getting
org.hibernate.MappingException: Foreign key (FKB278E73083D94769:users_posts_ratings_map [postId,userId])) must have same number of columns as the referenced primary key (users_posts_ratings_map [ratingId,postId,userId])
on servlet container initialization stage.
What does it mean (What are Foreign Keys in this mappings? What are Primary Keys? Which annotations are marking what?) and how it could be fixed?
java hibernate jpa orm hibernate-mapping
add a comment |
Having a following SQL table:
create table users_posts_ratings_map (
postId integer not null references posts (id),
userId integer not null references users (id),
ratingId integer not null references ratings (id),
primary key (postId, userId)
);
and Following JPA-Annotated POJOs:
RatingId.java:
@Embeddable
public class RatingId implements Serializable {
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@ManyToOne
@JoinColumn(name = "postId")
private Post post;
// getters and setters
}
UserPostRating.java:
@Entity(name = "users_posts_ratings_map")
public class UserPostRating {
@EmbeddedId
private RatingId userPost;
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
// getters and setters
}
Post.java
@Entity(name = "posts")
public class Post {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// irrelevant fields
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
// getters and setters
}
I am getting
org.hibernate.MappingException: Foreign key (FKB278E73083D94769:users_posts_ratings_map [postId,userId])) must have same number of columns as the referenced primary key (users_posts_ratings_map [ratingId,postId,userId])
on servlet container initialization stage.
What does it mean (What are Foreign Keys in this mappings? What are Primary Keys? Which annotations are marking what?) and how it could be fixed?
java hibernate jpa orm hibernate-mapping
Having a following SQL table:
create table users_posts_ratings_map (
postId integer not null references posts (id),
userId integer not null references users (id),
ratingId integer not null references ratings (id),
primary key (postId, userId)
);
and Following JPA-Annotated POJOs:
RatingId.java:
@Embeddable
public class RatingId implements Serializable {
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@ManyToOne
@JoinColumn(name = "postId")
private Post post;
// getters and setters
}
UserPostRating.java:
@Entity(name = "users_posts_ratings_map")
public class UserPostRating {
@EmbeddedId
private RatingId userPost;
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
// getters and setters
}
Post.java
@Entity(name = "posts")
public class Post {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// irrelevant fields
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
// getters and setters
}
I am getting
org.hibernate.MappingException: Foreign key (FKB278E73083D94769:users_posts_ratings_map [postId,userId])) must have same number of columns as the referenced primary key (users_posts_ratings_map [ratingId,postId,userId])
on servlet container initialization stage.
What does it mean (What are Foreign Keys in this mappings? What are Primary Keys? Which annotations are marking what?) and how it could be fixed?
java hibernate jpa orm hibernate-mapping
java hibernate jpa orm hibernate-mapping
asked Jan 5 '13 at 13:52
Alexander TuminAlexander Tumin
8061530
8061530
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
This mapping doesn't make much sense. You have an entity UserPostRating
, mapped to the users_posts_ratings_map
, and having a ManyToOne
association with the entity Post
.
And in Post
, you have a set of UserPostRating
, but you map it as a second association, and make it a ManyToMany
. It isn't a ManyToMany
. It's a OneToMany
, since the other side is a ManyToOne
. And since the bidirectional association is already mapped in UserPostRating
, you can't map it a second time in Post
. So the code should be:
@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
add a comment |
According to error message I suspect, that have to move definition of
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
from class UserPostRating
to class RatingId
.
add a comment |
The Mapping is correct, since it is a many to many mapping so its mapping will result to new table. So you should not refer to existing entity table, rather you should provide any other name whose mapping/entity name does not exist.
Below is your example :
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
Change the name from "users_posts_ratings_map"
to any other name like users_posts_ratings_map1
or users_posts_ratings_map_item
.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f14172401%2forg-hibernate-mappingexception-foreign-key-xxx-must-have-same-number-of-columns%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
This mapping doesn't make much sense. You have an entity UserPostRating
, mapped to the users_posts_ratings_map
, and having a ManyToOne
association with the entity Post
.
And in Post
, you have a set of UserPostRating
, but you map it as a second association, and make it a ManyToMany
. It isn't a ManyToMany
. It's a OneToMany
, since the other side is a ManyToOne
. And since the bidirectional association is already mapped in UserPostRating
, you can't map it a second time in Post
. So the code should be:
@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
add a comment |
This mapping doesn't make much sense. You have an entity UserPostRating
, mapped to the users_posts_ratings_map
, and having a ManyToOne
association with the entity Post
.
And in Post
, you have a set of UserPostRating
, but you map it as a second association, and make it a ManyToMany
. It isn't a ManyToMany
. It's a OneToMany
, since the other side is a ManyToOne
. And since the bidirectional association is already mapped in UserPostRating
, you can't map it a second time in Post
. So the code should be:
@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
add a comment |
This mapping doesn't make much sense. You have an entity UserPostRating
, mapped to the users_posts_ratings_map
, and having a ManyToOne
association with the entity Post
.
And in Post
, you have a set of UserPostRating
, but you map it as a second association, and make it a ManyToMany
. It isn't a ManyToMany
. It's a OneToMany
, since the other side is a ManyToOne
. And since the bidirectional association is already mapped in UserPostRating
, you can't map it a second time in Post
. So the code should be:
@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
This mapping doesn't make much sense. You have an entity UserPostRating
, mapped to the users_posts_ratings_map
, and having a ManyToOne
association with the entity Post
.
And in Post
, you have a set of UserPostRating
, but you map it as a second association, and make it a ManyToMany
. It isn't a ManyToMany
. It's a OneToMany
, since the other side is a ManyToOne
. And since the bidirectional association is already mapped in UserPostRating
, you can't map it a second time in Post
. So the code should be:
@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
answered Jan 5 '13 at 14:11
JB NizetJB Nizet
544k588881013
544k588881013
add a comment |
add a comment |
According to error message I suspect, that have to move definition of
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
from class UserPostRating
to class RatingId
.
add a comment |
According to error message I suspect, that have to move definition of
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
from class UserPostRating
to class RatingId
.
add a comment |
According to error message I suspect, that have to move definition of
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
from class UserPostRating
to class RatingId
.
According to error message I suspect, that have to move definition of
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;
from class UserPostRating
to class RatingId
.
answered Jan 5 '13 at 14:10
AndremoniyAndremoniy
22.1k675163
22.1k675163
add a comment |
add a comment |
The Mapping is correct, since it is a many to many mapping so its mapping will result to new table. So you should not refer to existing entity table, rather you should provide any other name whose mapping/entity name does not exist.
Below is your example :
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
Change the name from "users_posts_ratings_map"
to any other name like users_posts_ratings_map1
or users_posts_ratings_map_item
.
add a comment |
The Mapping is correct, since it is a many to many mapping so its mapping will result to new table. So you should not refer to existing entity table, rather you should provide any other name whose mapping/entity name does not exist.
Below is your example :
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
Change the name from "users_posts_ratings_map"
to any other name like users_posts_ratings_map1
or users_posts_ratings_map_item
.
add a comment |
The Mapping is correct, since it is a many to many mapping so its mapping will result to new table. So you should not refer to existing entity table, rather you should provide any other name whose mapping/entity name does not exist.
Below is your example :
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
Change the name from "users_posts_ratings_map"
to any other name like users_posts_ratings_map1
or users_posts_ratings_map_item
.
The Mapping is correct, since it is a many to many mapping so its mapping will result to new table. So you should not refer to existing entity table, rather you should provide any other name whose mapping/entity name does not exist.
Below is your example :
@ManyToMany
@JoinTable(
name = "users_posts_ratings_map",
joinColumns = { @JoinColumn(name = "ratingId") },
inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
)
private Set<UserPostRating> ratings = new HashSet<>();
Change the name from "users_posts_ratings_map"
to any other name like users_posts_ratings_map1
or users_posts_ratings_map_item
.
edited Nov 28 '18 at 3:30
TeeKea
3,22851832
3,22851832
answered Nov 28 '18 at 2:24
Manmaya ChampatirayManmaya Champatiray
1
1
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f14172401%2forg-hibernate-mappingexception-foreign-key-xxx-must-have-same-number-of-columns%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown