최대 절전 모드에서 Oracle Timestamp를 적절한 Java 유형에 매핑하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2473866

문제

나는 최선을 다하고 있습니다. 내 데이터베이스에는 열이있는 테이블이 있습니다. TIMESTAMP(6). 나는 NetBeans 6.5.1을 사용하고 있으며 생성 할 때 hibernate.reveng.xml, hbm.xml files, 그리고 pojo files 열을 유형으로 설정합니다 Serializable. 이것은 내가 기대했던 것이 아니라 내가 원하는 것이 아닙니다.

나는 찾았다 이것 최대 절전 모드 포럼에 배치 할 말 :

<sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />

에서 hibernate.reveng.xml 파일.

NetBeans에서는이 파일에서 매핑을 생성 할 수 없으며 (매일 새 파일을 생성 함) 파일에서 다시 생성 할 수있는 능력이없는 것 같습니다 (적어도. 이것 버전 7)에서 사용할 수있는 것으로 예정되어 있습니다.

그래서 나는 무엇을 해야할지 알아 내려고 노력하고 있습니다. 나는 이것에 익숙하지 않기 때문에 내가 뭔가 잘못하고 있다고 믿는 경향이 있으며, 다른 사람들에게는 일반적인 문제가 될 것 같습니다.

  • 그래서 내가 뭘 잘못하고 있니?
  • 내가 잘못한 일이 없다면 어떻게해야합니까?

나는 NetBeans 6.5, Oracle 10G를 사용하고 있으며 Hibernate 3 (내 Netbeans와 함께 제공)을 믿습니다.

편집하다: 내가 찾았다는 것을 의미했습니다 이것 Stackoverflow 질문이지만 실제로는 다른 문제입니다.

업데이트:내가 사용하고 있던 Oracle JDBC 드라이버 (OJDBC14.jar)는 9.0.2.0.0입니다.

  • OJDBC14.JAR 버전 10.2.0.4.0
  • OJDBC6.JAR 버전 11.2.0.1.0
도움이 되었습니까?

해결책

이 문제에 대한 작업을 찾았습니다. 이 문제 자체는 NetBeans 6.5 (그리고 나중에이 시점까지 버전)가 기존에서 데이터베이스를 리버스 엔지니어링 할 수 없다는 사실을 중심으로 진행되는 것 같습니다. hibernate.reveng.xml 파일. 이것은 버전 7에서 사용할 수있을 예정입니다.

내가 찾은 작업은 hbm.xml 그리고 Pojo Java 파일. 나는 현재 깨끗하고 빌드 할 때 이런 일이 발생했지만 데이터베이스 스키마가 변경 될 때만 실행되기 때문에 완전히 분리 할 수있는 방법을 찾으려고 노력할 것입니다.

깨끗하고 구축 할 때 이것을 달성하려면 편집해야합니다. build.xml 파일.

첫 번째 부분은 필요한 라이브러리입니다. 그래서 추가 :

<path id="toolslib">
        <path location="lib/hibernate-support/hibernate-tools.jar" />
        <path location="lib/hibernate-support/hibernate3.jar" />
        <path location="lib/hibernate-support/freemarker.jar" />
        <path location="lib/hibernate-support/jtidy-r938.jar" />
        <path location="lib/ojdbc14.jar" />
</path>

이미 Hibernate-Tools.jar, Hibernate3.jar 및 OJDBC14.JAR 파일이 있어야합니다. 그러므로 그들로가는 길을 바꾸십시오. 그만큼 프리 메이커 그리고 jtidy-r938.jar 내가 가지고 있지 않았으므로 다운로드해야합니다.

아래에서 build.xml 추가해야합니다.

<taskdef name="hibernatetool"
     classname="org.hibernate.tool.ant.HibernateToolTask"
     classpathref="toolslib">
    <classpath>
        <fileset dir="lib">
            <include name="**/*.jar"/>
        </fileset>
    </classpath>
</taskdef>

마지막으로 필요한 섹션은 청소 후 섹션에서 실행할 세트입니다.

<target name="-post-clean">
        <delete dir="src/*Put the foler where your pojos and hbm.xml files are located*"/>
        <hibernatetool>
            <jdbcconfiguration
                configurationfile="src\hibernate.cfg.xml"
                packagename="*the package where you want them recreated*"
                revengfile="src\hibernate.reveng.xml"
                detectmanytomany="true"
            />
            <hbm2hbmxml destdir="src" />
            <hbm2java  destdir="src" />
        </hibernatetool>
</target>
  • 삭제 부분은 기존 HBM 및 POJO 파일을 다시 만들기 전에 삭제됩니다.
  • 그만큼 configurationfile 기본 구성 파일을 가리 킵니다.
  • 패키지 이름은 당신이 만들고 싶은 점 분리 패키지입니다.com.stackoverflow.pojo 예를 들어).
  • 그만큼 revengfile HBM 및 POJO 파일을 만들 때 사용할 리버스 엔지니어링 XML 파일입니다.
  • 그만큼 hbm2hbmxml will create the hbm.xml 테이블 파일.
  • 그만큼 hbm2java 테이블의 Java Pojo 파일을 만듭니다.

이제 Oracle 타임 스탬프를 다른 것 Serializable, 편집 hibernate.reveng.xml 파일 및 추가 :

<type-mapping>
        <sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />
</type-mapping>

스키마 선택 태그 직후.

그래서 깨끗하고 빌드와 타임 스탬프는 java.sql.Timestamp 대신에 Serializable 사물.

이것은 내가 아는 긴 대답이지만, 이것은 당신이 설정해야 할 다른 변경 사항에도 효과가 있어야합니다. hibernate.reveng.xml 파일 (생각합니다). 나는 최대 절전 모드 전문가가 아니므로 마일리지는 이것에 따라 다를 수 있습니다.

업데이트:그래서 인터넷 검색 후 나는 찾았다 이것 NetBeans의 맞춤형 개미 작업에 대한 사이트. 그래서 나는 단순히 대상의 이름을 gen-dao 그리고 지금은 깨끗하고 구축 할 때마다, 구체적으로 호출 할 때마다 실행되지 않습니다.

다른 팁

나는 비슷한 문제에 직면하여 내 자신의 RevengnamingStrategy를 작성하여 해결했습니다.

Timestamp_with_timezone 및 timestamp_with_local_timezone과 같은 두 개의 열이있는 테이블이 있으며 리버스 엔지니어링 프로세스에서는 세랄화 가능에 매핑됩니다.

timestamp_with_timezone의 sqltypes 및 timestamp_with_local_timezone 유형은 -101 및 -102입니다. java.sql.types 이러한 유형의 경우, 이들은 세랄화 가능에 매핑됩니다.

그래서 내 자신의 RevengnamingStrategy를 썼는데,이 유형은 타임 스탬프로 변환합니다. 인턴은 타임 스탬 타입으로 변환합니다.

public class OracleRevengNamingStrategy extends DefaultRevengNamingStrategy {

    private static final Integer TIMESTAMP_WITH_TIMEZONE_SQL_CODE = -101;

    private static final Integer TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE = -102;


    public OracleRevengNamingStrategy(ReverseEngineeringStrategy delegate) {
        super(delegate);
    }

    // Converts Timestamp with tomezone and Time stamp with local time zone to Timestamp
    @Override
    public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale,
                                            boolean nullable, boolean generatedIdentifier) {
        String type;

        if (sqlType == TIMESTAMP_WITH_TIMEZONE_SQL_CODE || sqlType == TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE) {
            type = "timestamp";
        } else {
            type = super.columnToHibernateTypeName(table, columnName, sqlType, length, precision, scale, nullable, generatedIdentifier);
        }

        return type;
    }

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top