sql >> データベース >  >> RDS >> Oracle

Hibernateで複合主キーのIDを自動インクリメントするにはどうすればよいですか?

    コメントで述べたように、私は@IdClassを使用しました hsqldbで試している間は機能しました インメモリデータベースですが、mysqlで機能しませんでした 。

    hibernate 5を使用していることに注意してください

    オラクルを試してみてください。思い出せませんでしたが、うまくいくはずです。ただし、アプローチに欠点があるかどうかを確認してください。

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.techdisqus</groupId>
        <artifactId>spring5-mvc-hibernate-example</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
        <properties>
            <failOnMissingWebXml>false</failOnMissingWebXml>
            <spring.version>5.0.0.RELEASE</spring.version>
            <hibernate.version>5.2.11.Final</hibernate.version>
            <hibernate.validator>5.4.1.Final</hibernate.validator>
            <c3p0.version>0.9.5.2</c3p0.version>
            <jstl.version>1.2.1</jstl.version>
            <tld.version>1.1.2</tld.version>
            <servlets.version>3.1.0</servlets.version>
            <jsp.version>2.3.1</jsp.version>
            <hsqldb.version>1.8.0.10</hsqldb.version>
        </properties>
        <dependencies>
            <!-- Spring MVC Dependency -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- Spring ORM -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- Hibernate ORM -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
    
            <!-- Hibernate-C3P0 Integration -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-c3p0</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
    
            <!-- c3p0 -->
            <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>c3p0</artifactId>
                <version>${c3p0.version}</version>
            </dependency>
    
            <!-- Hibernate Validator -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>${hibernate.validator}</version>
            </dependency>
    
            <!-- JSTL Dependency -->
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>javax.servlet.jsp.jstl-api</artifactId>
                <version>${jstl.version}</version>
            </dependency>
    
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>${tld.version}</version>
            </dependency>
    
            <!-- Servlet Dependency -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>${servlets.version}</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- JSP Dependency -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>${jsp.version}</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- HSQL Dependency -->
              <dependency>
                <groupId>hsqldb</groupId>
                <artifactId>hsqldb</artifactId>
                <version>${hsqldb.version}</version>
            </dependency>  
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.12</version>
            </dependency>
        </dependencies>
    
        <build>
            <sourceDirectory>src/main/java</sourceDirectory>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
    
                <!-- Embedded Apache Tomcat required for testing war -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <path>/</path>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    Book.java

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.IdClass;
    import javax.persistence.Table;
    
    @Entity(name = "Book")
    @Table(name = "book")
    @IdClass( PK.class )
    public class Book {
    
        @Id
        @Column(name = "registration_number")
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long registrationNumber;
    
        @Id
        @Column(name = "publisher_id")
        private Integer publisherId;
    
        private String title;
    
        public Long getRegistrationNumber() {
            return registrationNumber;
        }
    
        public void setRegistrationNumber(Long registrationNumber) {
            this.registrationNumber = registrationNumber;
        }
    
        public Integer getPublisherId() {
            return publisherId;
        }
    
        public void setPublisherId(Integer publisherId) {
            this.publisherId = publisherId;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        @Override
        public String toString() {
            return "Book [registrationNumber=" + registrationNumber + ", publisherId=" + publisherId + ", title=" + title
                    + "]";
        }
     }
    

    PK.java

    import java.io.Serializable;
    import java.util.Objects;
    
    public class PK implements Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 2371758145387850080L;
    
        private Long registrationNumber;
        private Integer publisherId;
    
        public PK(Long registrationNumber, Integer publisherId) {
            this.registrationNumber = registrationNumber;
            this.publisherId = publisherId;
        }
    
    
        public PK() {
        }
    
        @Override
        public boolean equals(Object o) {
            if ( this == o ) {
                return true;
            }
            if ( o == null || getClass() != o.getClass() ) {
                return false;
            }
            PK pk = (PK) o;
            return Objects.equals( registrationNumber, pk.registrationNumber ) &&
                    Objects.equals( publisherId, pk.publisherId );
        }
    
        @Override
        public int hashCode() {
            return Objects.hash( registrationNumber, publisherId );
        }
    }
    

    hibernate.cfg.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.archive.autodetection">class,hbm</property>
            <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
            <property name="hibernate.connection.username">sa</property>
            <property name="hibernate.connection.password"></property>
            <property name="hibernate.connection.url">jdbc:hsqldb:mem:test</property>
            <property name="hibernate.hbm2ddl.auto">create</property>
    
            <property name="hibernate.c3p0.min_size">5</property>
            <property name="hibernate.c3p0.max_size">20</property>
            <property name="hibernate.c3p0.acquire_increment">2</property>
            <property name="hibernate.c3p0.acquire_increment">1800</property>
            <property name="hibernate.c3p0.max_statements">150</property>
        </session-factory>
    </hibernate-configuration>
    

    HibernateConfig.java

    @Configuration
    @EnableTransactionManagement
    @ComponentScans(value = { @ComponentScan("com.techdisqus")})
    public class HibernateConfig {
    
        @Autowired
        private ApplicationContext context;
    
        @Bean
        public LocalSessionFactoryBean getSessionFactory() {
            LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
            factoryBean.setConfigLocation(context.getResource("classpath:hibernate.cfg.xml"));
            factoryBean.setAnnotatedClasses(Book.class);
            return factoryBean;
        }
    
        @Bean
        public HibernateTransactionManager getTransactionManager() {
            HibernateTransactionManager transactionManager = new HibernateTransactionManager();
            transactionManager.setSessionFactory(getSessionFactory().getObject());
            return transactionManager;
        }
    
    }
    

    BookDAOImpl.java

    @Repository
    public class BookDAOImpl implements BookDAO {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
    
    
    
        public void save(Book book) {
            Session session = this.sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            session.persist(book);
            tx.commit();
            session.close();
    
        }
    
    }
    

    クライアントコード:

    public class SpringHibernateMain2 {
    
        public static void main(String[] args) {
    
            ApplicationContext appContext = new AnnotationConfigApplicationContext(HibernateConfig.class);
    
            BookDAO personDAO = appContext.getBean(BookDAO.class);
    
            Book book = new Book();
            book.setPublisherId(12);
            book.setTitle("t 1");
            //book.setRegistrationNumber(2l);
            personDAO.save(book);
    
            System.out.println("book::"+book);
    
    
    
    
            //context.close();
    
        }
    
    }
    

    Hで使用中のログから:

    以下はerrorです MySqlを試してみると得られます

    投稿埋め込みキーにSQL ServerのID列が含まれていると、Hibernate挿入が失敗します しかし、それでは運がありません。



    1. Windows Azure VMのパフォーマンスの比較、パート2

    2. Oracleディレクトリの権限を照会するにはどうすればよいですか?

    3. どのデータマスキング機能を使用する必要がありますか?

    4. 値が最大カウントを持つmysql