Java 如何强制对jointable使用给定的表名?
我正在使用SpringDataJPA并建立我的第一个多人关系。我将第一个对象“用户”定义为:Java 如何强制对jointable使用给定的表名?,java,spring,hibernate,jpa,relationship,Java,Spring,Hibernate,Jpa,Relationship,我正在使用SpringDataJPA并建立我的第一个多人关系。我将第一个对象“用户”定义为: import javax.persistence.*; import java.util.Set; @Entity @Table(name = "SMX0_PAR_USER", schema = "SMX0_INPUT_DAY") public class User { @Id private String userID; private String username;
import javax.persistence.*;
import java.util.Set;
@Entity
@Table(name = "SMX0_PAR_USER", schema = "SMX0_INPUT_DAY")
public class User {
@Id
private String userID;
private String username;
@ManyToMany
@JoinTable(
name = "SMX0_PAR_USER_ROLE",
schema = "SMX0_INPUT_DAY",
joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "userID"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "roleID")
)
private Set<Role> roleSet;
protected User(){
}
public User(String userID, String username){
this.userID = userID;
this.username = username;
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import java.util.Set;
@Entity
@Table(name = "SMX0_PAR_ROLE", schema = "SMX0_INPUT_DAY")
public class Role {
@Id
private int roleID;
private String rolename;
@ManyToMany(mappedBy = "roleSet")
private Set<User> userSet;
protected Role(){
}
public Role(int roleID, String role){
this.roleID = roleID;
this.rolename = role;
}
这里发生了什么,当我显式地将联接表名设置为其他名称时,为什么会引用“ROLESET0_2;”之类的内容?如何强制使用我已经给出的表名?
ROLESET0\u
是hibernate在其生成的查询中指定的别名。如果设置spring.jpa.show sql=true
以查看hibernate生成的完整查询,可能会有所帮助。您还可以设置spring.jpa.properties.hibernate.format_sql=true
,使其更具可读性。尝试为两个类中的所有字段添加注释@Column(name=“YourColumnName”)
另外,referencedColumnName
参数应该是该外键列引用的列的名称
public class User {
@Id
@Column(name = "YourColumnName")
private int roleID;
@Column(name = "YourColumnName")
private String rolename;
@ManyToMany
@JoinTable(
name = "SMX0_PAR_USER_ROLE",
schema = "SMX0_INPUT_DAY",
joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "YourColumnName"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName ="YourColumnName"))
.....
}
public class Role {
@Id
@Column(name = "YourColumnName")
private int roleID;
@Column(name = "YourColumnName")
private String rolename;
.......
}
请共享您的导入语句
ROLESET0\u
是hibernate在其生成的查询中指定的别名。如果设置spring.jpa.show sql=true
以查看hibernate生成的完整查询,可能会有所帮助。您还可以设置spring.jpa.properties.hibernate.format_sql=true
,以使其更具可读性。@AmerQarabsa我已经在您创建时添加了导入语句requested@AndrewMairose请将您的注释添加为答案,以便我可以接受->它确实是一个别名,而不是查询中使用的名为的表,当您看到实际的查询时,这一点变得很明显。
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates//module/userManagement/index.html]")
…
Caused by: org.attoparser.ParseException: could not extract ResultSet
…
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
…
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "ROLESET0_"."ROLE_ID": invalid identifier
public class User {
@Id
@Column(name = "YourColumnName")
private int roleID;
@Column(name = "YourColumnName")
private String rolename;
@ManyToMany
@JoinTable(
name = "SMX0_PAR_USER_ROLE",
schema = "SMX0_INPUT_DAY",
joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "YourColumnName"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName ="YourColumnName"))
.....
}
public class Role {
@Id
@Column(name = "YourColumnName")
private int roleID;
@Column(name = "YourColumnName")
private String rolename;
.......
}