Java 如何为特定SQL查询创建带有hibernate注释的类
我目前正在为我的网站提供登录/注册服务。有人能给我解释一下下面发布的查询的java类应该是什么样子的吗Java 如何为特定SQL查询创建带有hibernate注释的类,java,sql,spring-boot,hibernate,jdbc,Java,Sql,Spring Boot,Hibernate,Jdbc,我目前正在为我的网站提供登录/注册服务。有人能给我解释一下下面发布的查询的java类应该是什么样子的吗 CREATE TABLE users ( username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, enabled TINYINT NOT NULL DEFAULT 1, PRIMARY KEY (username) ); CREATE TABLE authorities (
CREATE TABLE users
(
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
enabled TINYINT NOT NULL DEFAULT 1,
PRIMARY KEY (username)
);
CREATE TABLE authorities
(
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL,
FOREIGN KEY (username) REFERENCES users(username)
);
CREATE UNIQUE INDEX ix_auth_username
ON authorities (username, authority);
我对hibernate注释有问题。不知道如何正确加入“权威”栏
我创建了以下两个类:
Users.java
@Entity
public class Users extends AbstractEntity implements Cloneable {
@NotNull
@NotEmpty
private String username = "";
@NotNull
@NotEmpty
private String password = "";
@NotNull
@ColumnDefault(value = "1")
private byte enabled;
//here is the problem
@OneToMany
@JoinColumn(name = "authorities_username")
private Authorities authorities;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public byte getEnabled() {
return enabled;
}
public void setEnabled(byte enabled) {
this.enabled = enabled;
}
public Authorities getAuthorities() {
return authorities;
}
public void setAuthorities(Authorities authorities) {
this.authorities = authorities;
}
}
Authorities.java
@Entity
public class Authorities extends AbstractEntity{
private String username;
public enum Authority {
ROLE_USER, ROLE_ADMIN
}
@NotNull
@Enumerated(EnumType.STRING)
@OneToMany
private Authorities.Authority authority;
public Authorities() { }
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Authority getAuthority() {
return authority;
}
}
对不起我的英语;)
AbstractEntity.java
@MappedSuperclass
public abstract class AbstractEntity {
@Id
@GeneratedValue(strategy= GenerationType.SEQUENCE)
private Long id;
public Long getId() {
return id;
}
public boolean isPersisted() {
return id != null;
}
@Override
public int hashCode() {
if (getId() != null) {
return getId().hashCode();
}
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AbstractEntity other = (AbstractEntity) obj;
if (getId() == null || other.getId() == null) {
return false;
}
return getId().equals(other.getId());
}
}
我认为您需要在authorities类中使用
@OneToMany(mappedBy=“authorities”)
注释
另见:
希望有帮助。祝您一切顺利。如果您在映射enum文件时遇到问题,您可以这样做:
@Column(name="myenum")
@Enumerated(EnumType.ORDINAL)
private MyEnum myEnum;
您可以使用@Enumerated批注的EnumType enum属性指定如何在数据库中持久化枚举。EnumType.ORDINAL指定枚举将作为整数值持久化。在这里,设置为VALUE1的MyEnum将被持久化为0,VALUE2将被持久化为1,以此类推
另一种方法是使用EnumType.STRING指定使用字段设置为的枚举值的名称持久化枚举。因此,应用于上一个示例,将字段Myenum设置为Myenum.VALUE1将保持为VALUE1,以此类推
首先,不要忘记在另一个.java文件中这样定义枚举:
public enum myEnum {
value1(0, "value1");
}
您可以使用Hibernate工具。在目录wiht pom.exe中运行mvn org.hibernate:hibernate工具maven plugin:hbm2java
<plugin>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-tools-maven-plugin</artifactId>
<version>5.4.19.Final</version>
<executions>
<execution>
<id>Display Help</id>
<phase>validate</phase>
<goals>
<goal>help</goal>
</goals>
</execution>
<execution>
<id>Entity generation</id>
<phase>validate</phase>
<goals>
<goal>hbm2java</goal>
</goals>
</execution>
</executions>
<configuration>
<revengFile>${project.basedir}/src/assembly/hibernate.reveng.xml</revengFile>
<packageName>[your packageName]</packageName>
<detectManyToMany>true</detectManyToMany>
<detectOneToOne>true</detectOneToOne>
<detectOptimisticLock>true</detectOptimisticLock>
<createCollectionForForeignKey>true</createCollectionForForeignKey>
<createManyToOneForForeignKey>true</createManyToOneForForeignKey>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<ejb3>true</ejb3>
<jdk5>true</jdk5>
</configuration>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresqlVersion}</version>
</dependency>
</dependencies>
</plugin>
org.hibernate
hibernate工具maven插件
5.4.19.4最终版本
显示帮助
验证
帮助
实体生成
验证
hbm2java
${project.basedir}/src/assembly/hibernate.reveng.xml
[你的包装名称]
真的
真的
真的
真的
真的
${project.basedir}/src/main/java
真的
真的
org.postgresql
postgresql
${postgresqlVersion}
hibernate工具将生成一个带有注释的实体我已经尝试并得到了以下结果:
非法尝试将非集合映射为@OneToMany、@ManyToMany或@CollectionFements:
。也许我应该为authority变量使用其他类型…您是否也可以显示您的AbstractEntity
实体?列authorities.username
是authorities
表的主键?您的映射问题是enum字段?“如果是这样的话,你就不需要任何注释了。”斯特恩克补充道AbstractEntity@Jakub19AbstractEntity
中的映射假设两个表都应该有integerid
字段,但我在表定义中没有看到它。我已经尝试了enumerate(EnumType.STRING)
并得到了这个:属性[com.jakubw.main.backend.entity.Users.authorities]被注释为枚举,但其java类型不是枚举[com.jakubw.main.backend.entity.authorities]
您不需要在java类中定义枚举,只需将其定义为枚举,因此,这意味着您不需要Authority类。