Java 如何为特定SQL查询创建带有hibernate注释的类

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 (

我目前正在为我的网站提供登录/注册服务。有人能给我解释一下下面发布的查询的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 
(
    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@Jakub19
AbstractEntity
中的映射假设两个表都应该有integer
id
字段,但我在表定义中没有看到它。我已经尝试了
enumerate(EnumType.STRING)
并得到了这个:
属性[com.jakubw.main.backend.entity.Users.authorities]被注释为枚举,但其java类型不是枚举[com.jakubw.main.backend.entity.authorities]
您不需要在java类中定义枚举,只需将其定义为枚举,因此,这意味着您不需要Authority类。